<?php

namespace app\common;

use think\app\Service;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Event;
use think\facade\Route;

/**
 * 插件初始化操作
 * Class AppEvent
 * @package common
 */
class InitAddons extends Service
{
    public function handle()
    {
        // 初始化插件事件
        $this->initAddonEvent();

        // 解析插件路由
        $this->initAddonRoute();
    }

    /**
     * 初始化插件事件
     */
    public function initAddonEvent()
    {
        $listenList = [];
        $cache = Cache::get("addons_event_list");

        if (!empty($cache))
        {
            $listenList = $cache;
        } else {

            // 从数据库取出所有已安装的插件
            $addons = Db::name('addons')->where(['status' => 1])->select()->toArray();
            foreach ($addons as $addon)
            {
                $eventPath = app()->getRootPath() . '/addons/'.$addon['keyname'].'/config/event.php';
                if (file_exists($eventPath))
                {
                    $eventConf = require_once $eventPath;
                    $listenList[] = $eventConf['listen'] ?? [];
                }
            }
        }

        // 过滤空的监听事件
        $listenList = array_filter($listenList);
        if(!empty($listenList))
        {
            // 监听事件存入数组
            Cache::set("addons_event_list", $listenList);
            foreach ($listenList as $listen)
            {
                // 监听事件
                Event::listenEvents($listen);
            }
        }
        return true;
    }

    /**
     * 解析插件路由
     */
    public function initAddonRoute()
    {
        // 定义系统所有应用
        $sysAppList = ['admin', 'api'];

        $pathInfo = $_GET['s'] ?? '/admin'; // 这个参数的获取有问题

        $params = $this->parseUrl($pathInfo);   // ex:['alioss', 'admin', 'index', 'config']


        // 如果不属于系统应用
        if (!in_array($params[0], $sysAppList))
        {
            $module = $params[1] ?: 'admin';
            $controller = $params[2] ?: 'index';
            $method = $params[3] ?: 'index';

            $this->app->setNamespace("addons\\" . $params[0] . '\\' . $module);
            $this->app->setAppPath(rootPath() . 'addons' . '/' . $params[0] . '/' .$module. '/');

            Route::rule($pathInfo, $module . '/' . $controller . '/' . $method);
        } else {
            $this->app->setNamespace('app\\' . $params[0] . '\\controller');
            $this->app->setAppPath(rootPath() . 'app/' . $params[0]);
        }
        return true;
    }

    /**
     * 以后可能要改,先封装起来
     * @return array
     */
    private function parseUrl($pathInfo)
    {
        $result = explode('/', $pathInfo);
        return array_values(array_filter($result));
    }
}